#include "Dri_Timer0.h"

// static unsigned int s_ms_count;
#define MAX_CALLBACK_LENGTH 2

// 注册的回调函数缓存
static CallbackFunction s_funs[MAX_CALLBACK_LENGTH];

/**
 * @brief 定时器初始化
 *
 */
void Dri_Timer0_Init()
{
    unsigned char i;
    // 打开中断总开关
    EA = 1;
    // 打开定时器0中断开关
    ET0 = 1;

    // 设置定时器0的工作模式 [GATE C/T M1 M0]
    TMOD &= 0xF0;
    TMOD |= 0x01;

    // 设置TR0开关
    TR0 = 1;

    // 设置定时器的初始值[定时1ms]
    TL0 = 64615 % 256;
    TH0 = 64615 / 256;

    // s_ms_count = 0;
    for (i = 0; i < MAX_CALLBACK_LENGTH; i++) {
        s_funs[i] = NULL;
    }
}

/**
 * @brief 注册回调函数到定时器
 *
 * @param func
 */
void Dri_Timer0_RegisterCallbackFunction(CallbackFunction func)
{
    unsigned char i;
    // 1、判断之前是否注册过
    for (i = 0; i < MAX_CALLBACK_LENGTH; i++) {
        if (s_funs[i] == func) {
            return;
        }
    }
    // 2、注册
    for (i = 0; i < MAX_CALLBACK_LENGTH; i++) {
        if (s_funs[i] == NULL) {
            s_funs[i] = func;
            return;
        }
    }
}

/**
 * @brief 定时器中断的处理函数
 *
 */
static void Dri_Timer0_Func() interrupt 1
{
    unsigned char i;
    // 设置定时器的初始值[定时1ms],如果没有设置会根据溢出之后的初始值0开始累加脉冲
    TL0 = 64615 % 256;
    TH0 = 64615 / 256;

    for(i=0;i<MAX_CALLBACK_LENGTH;i++){
        if( s_funs[i]!=NULL ){
            //执行回调
            s_funs[i]();
        }
    }

}